<?php
	include_once "SPDO.class.php";
	include_once "EltAct.class.php";
	include_once "ChauffageAct.class.php";
	include_once "StoreAct.class.php";
	include_once "utilisateur.class.php";
	include_once "equipement.class.php";
	include_once "piece.class.php";
	include_once "store.class.php";
	include_once "chauffage.class.php";
			
	class Jour
	{
		private $listeEventElt;
		private $debutJour;
		private $finJour;
		
		public function __construct($date)
		{
			$this->debutJour = strtotime(date('Y-m-d',$date).' 00:00:00');
			$this->finJour = strtotime(date('Y-m-d',$date).' 23:59:59');
			$this->listeElemEvent();
		}
		/* 
		 * Méthode listeElemEvent() : Permet de récupérer la liste des éléments en cours qui concernent la journée en cours.
		 * Le résultat est stocké dans $this->listeEventElt
		 */
		public function listeElemEvent()
		{
			$pdo = SPDO::pdo();
			$liste = array();
			$listeChauffage = array();
			$listeStore = array();
			/*Rajouter toutes les listes d'éléments de type différents ici*/
			$listePiece = unserialize($_SESSION['utilisateur'])->piece;
			if(count($listePiece)>0)
			{
				foreach($listePiece as $piece)
				{
					if(count($piece->equipement) != 0)
					{
						foreach($piece->equipement as $equipement)
						{
							if(get_class($equipement)=="Chauffage")
							{
								$listeChauffage[]=$equipement;
							}
							else if(get_class($equipement)=="Store")
							{
								$listeStore[]=$equipement;
							}
						}
					} 
					
					$requeteElt = $pdo->query("SELECT ActionElement.ID_Element as ID_Element, 
													E1.ID_ActionElement as ID_ActionElement, 
													E2.ID_ActionElement as ID_ActionElementF, 
													UNIX_TIMESTAMP(E1.Debut) as Debut, 
													UNIX_TIMESTAMP(E2.Debut) as Fin, Description 
												FROM Evenement E1, Evenement E2, ActionElement, Element 
												WHERE E1.Fin = E2.ID_Evenement 
													AND Element.ID_Element = ActionElement.ID_Element 
													AND E1.ID_ActionElement = ActionElement.ID_ActionElement 
													AND UNIX_TIMESTAMP(E2.Debut)>=".$this->debutJour." 
													AND UNIX_TIMESTAMP(E1.Debut)<=".$this->finJour." 
													AND Element.ID_Piece=".$piece->ID." ORDER BY Debut");
					$listeElt = $requeteElt->fetchAll();
					if(count($listeElt)>0)
					{
						foreach($listeElt as $elt)
						{
							$find=false;
							$i=0;
							while(($i<count($listeChauffage)) && (!$find))
							{
								if($elt['ID_Element']==$listeChauffage[$i]->IDElement)
								{
									$find = true;
									$requeteActionChauff = $pdo->query("SELECT * FROM ActionChauffage WHERE ID_ActionElement=".$elt['ID_ActionElement']);
									$actionChauff = $requeteActionChauff->fetch();
									$requeteActionDefaut = $pdo->query("SELECT * FROM ActionChauffage WHERE ID_ActionElement=".$elt['ID_ActionElementF']);
									$actionDefaut = $requeteActionDefaut->fetch();
									$objEltFin = new ChauffageAct($elt['ID_Element'], $elt['Fin'], NULL, $actionDefaut['Temperature'], $actionDefaut['Etat'], $elt['ID_ActionElementF']);
									$objEltDeb = new ChauffageAct($elt['ID_Element'], $elt['Debut'], $objEltFin, $actionChauff['Temperature'], $actionChauff['Etat'], $elt['ID_ActionElement']);
									$liste[]=$objEltDeb;
								}
								$i++;
							}
							$i=0;
							while(($i<count($listeStore)) &&(!$find))
							{
								if($elt['ID_Element']==$listeStore[$i]->IDElement)
								{
									$find = true;
									$requeteActionStore = $pdo->query("SELECT * FROM ActionStore WHERE ID_ActionElement=".$elt['ID_ActionElement']);
									$actionStore = $requeteActionStore->fetch();
									$requeteActionDefaut = $pdo->query("SELECT * FROM ActionStore WHERE ID_ActionElement=".$elt['ID_ActionElementF']);
									$actionDefaut = $requeteActionDefaut->fetch();
									$objEltFin = new StoreAct($elt['ID_Element'], $elt['Fin'], NULL, $actionDefaut['Position'], $elt['ID_ActionElementF']);
									$objEltDeb = new StoreAct($elt['ID_Element'], $elt['Debut'], $objEltFin, $actionStore['Position'], $elt['ID_ActionElement']);
									$liste[] = $objEltDeb;
								}
								$i++;
							}
							/*Mettre les vérifications pour les autres types d'éléments ici*/
						}
					}
				}
			}
			$this->listeEventElt=$liste;
		}
		
		public function __get($name)
		{
			if(property_exists(get_class(), $name))
			{
				return $this->$name;
			}
		}
		/*
		 * Méthode afficher() : Permet d'afficher les événements de la journée dans des lignes de tableau <td>
		 * Le tout est contenu dans <div class = "divJour">
		 * ATTENTION : En cas d'affichage direct d'une journée, il faut instancier <table> depuis l'extérieur de la fonction.
		 */
		public function afficher()
		{
			$pdo = SPDO::pdo();
			echo "<td><div class='divJour'><table class='tableJour'>";
			$c = true;
			foreach($this->listeEventElt as $event)
			{
				echo "<tr><td>";
				$event->afficher($c);
				$c=!$c;
				echo "</td></tr>";
			}
			echo "</table></td></div>";
		}
		/*
		 * Methode EventExiste : Permet de vérifier si un événement correspondant au même ID_Element que celui présent dans $eltAct durant la même période existe déjà.
		 * $eltAct : Type ChauffageAct ou StoreAct
		 * Renvoie un booléen.
		 */
		public function EventExiste($eltAct)
		{
			$deb = date('Y-m-d H:i:s', $eltAct->Debut);
			$fin = date('Y-m-d H:i:s', $eltAct->Fin->Debut);
			$pdo=SPDO::pdo();
			$requeteVerif = $pdo->query("SELECT * FROM Evenement E1, Evenement E2, ActionElement WHERE E1.ID_ActionElement=ActionElement.ID_ActionElement AND ActionElement.ID_Element=".$eltAct->ID_Element." AND E1.Fin=E2.ID_Evenement AND ((E1.Debut<='".$deb."' AND E2.Debut>='".$deb."') OR (E1.Debut<='".$fin."' AND E2.Debut>='".$fin."') OR (E1.Debut BETWEEN '".$deb."' AND '".$fin."') OR (E2.Debut BETWEEN '".$deb."' AND '".$fin."'))");
			$resultVerif = $requeteVerif->fetchAll();
			if(count($resultVerif)>0)
			{
				return true;
			}
			else
			{
				return false;
			}
		}
		/*
		 * Methode ajouterEvent() : Fonction insérant les informations de $eltAct dans la base de données.
		 * $eltAct : Type ChauffageAct ou StoreAct
		 * Renvoie 0 en cas de succès, 1 si l'insertion a échoué, 2 si un événement concernant le même ID_Element et la même période éxiste déjà
		 */
		public function ajouterEvent($eltAct)
		{
			if(!$this->EventExiste($eltAct))
			{
				$pdo = SPDO::pdo();
				try 
				{
					$pdo->beginTransaction();
					$ajoutActionElemFin = $pdo->exec("INSERT INTO ActionElement VALUES('',".$eltAct->ID_Element.")");//Ajout ActionElem de fin
					$idActionElement = $pdo->lastInsertId();
					if(get_class($eltAct)=='ChauffageAct')//Ajout de ActionStore ou Chauffage de fin
					{
						$ajoutActionChauffFin = $pdo->exec("INSERT INTO ActionChauffage VALUES('',".$eltAct->Fin->Etat.",".$eltAct->Fin->Temperature.",".$idActionElement.")");					
					}
					else if(get_class($eltAct)=='StoreAct')
					{
						$ajoutActionStoreFin = $pdo->exec("INSERT INTO ActionStore VALUES('',".$eltAct->Fin->Position.",".$idActionElement.")");
					}
					else
					{
						throw new Exception();
					}
					$ajoutEvenementFin = $pdo->exec("INSERT INTO Evenement VALUES('',".$idActionElement.",'".date('Y-m-d H:i:s',$eltAct->Fin->Debut)."',NULL)");//Ajout de Evenement de fin[fin = NULL]
					$idEvenementFin = $pdo->lastInsertId();
					$ajoutActionElemDeb = $pdo->exec("INSERT INTO ActionElement VALUES('',".$eltAct->ID_Element.")");//Ajout de ActionElem de debut
					$idActionElement = $pdo->lastInsertId();
					if(get_class($eltAct)=='ChauffageAct')//Ajout de ActionStore ou ActionChauffage de debut
					{
						$ajoutActionChauffDeb = $pdo->exec("INSERT INTO ActionChauffage VALUES('',".$eltAct->Etat.",".$eltAct->Temperature.",".$idActionElement.")");
					}
					else if(get_class($eltAct)=='StoreAct')
					{
						$ajoutActionStoreDeb = $pdo->exec("INSERT INTO ActionStore VALUES('',".$eltAct->Position.",".$idActionElement.")");
					}
					$ajoutEvenementDeb = $pdo->exec("INSERT INTO Evenement VALUES('',".$idActionElement.",'".date('Y-m-d H:i:s',$eltAct->Debut)."',".$idEvenementFin.")");//Ajout de Evenement de debut[fin = Evenement de fin]
					$pdo->commit();
					return 0;
				}
				catch (Exception $e)
				{
					$pdo->rollBack();
					return 1;
				}
			}
			else
			{
				return 2;
			}
		}
		/*
		 *Methode majEvent : Prépare l'insertion des requêtes dans la base de données.
		 *Renvoie 0 si l'insertion est effectuée, 1 en cas d'échec lors de l'insertion, 2 si un événement correspondant au même ID_Element dans la même période de temps existe déjà.
		 */
		public function majEvent()
		{
			$pdo = SPDO::pdo();
			$debut = strtotime(intval($_POST['anneeDeb']).'-'.intval($_POST['moisDeb']).'-'.intval($_POST['jourDeb'])." ".intval($_POST['heureDeb']).':'.intval($_POST['minDeb']).':'.intval($_POST['secDeb']));
			$fin = strtotime(intval($_POST['anneeFin']).'-'.intval($_POST['moisFin']).'-'.intval($_POST['jourFin'])." ".intval($_POST['heureFin']).':'.intval($_POST['minFin']).':'.intval($_POST['secFin']));
			$result = 3;			
			$listePiece = unserialize($_SESSION['utilisateur'])->piece;
			foreach($listePiece as $piece)
			{
				if(count($piece->equipement) != 0)
				{
					foreach($piece->equipement as $equipement)
					{
						if(get_class($equipement)=='Chauffage')
						{
							$requete = $pdo->query("SELECT * FROM Chauffage WHERE ID_Element = ".$equipement->IDElement);
							$resultChauff = $requete->fetchAll();
							if(count($resultChauff)>0)
							{
								$chauffEtat = 0;
								if($_POST['chauffEtat'.$equipement->ID]=='on')
								{
									$chauffEtat = 1;
								}
								if(($_POST['chauffTemp'.$equipement->ID]!=$resultChauff[0]['Temperature'])||($chauffEtat!=$resultChauff[0]['Etat']))
								{
									$chauffActFin = new ChauffageAct($equipement->IDElement, $fin, null,$resultChauff[0]['Temperature'], $resultChauff[0]['Etat'],null);
									$chauffActDeb = new ChauffageAct($equipement->IDElement, $debut ,$chauffActFin, $_POST['chauffTemp'.$equipement->ID], $chauffEtat,null);
									$result = $this->ajouterEvent($chauffActDeb);
								}
							}
						}
						else if(get_class($equipement)=='Store')
						{
							if($_POST['storePosition'.$equipement->ID]!=$equipement->position)
							{
								$requete = $pdo->query("SELECT * FROM Stores WHERE ID_Element =".$equipement->IDElement);
								$resultStore = $requete->fetchAll();
								if(count($resultStore)>0)
								{
									$storeActFin = new StoreAct($equipement->IDElement, $fin, null, $resultStore[0]['Position'], null);
									$storeActDeb = new StoreAct($equipement->IDElement, $debut, $storeActFin, $_POST['storePosition'.$equipement->ID],null);
									$result = $this->ajouterEvent($storeActDeb);
								}
							}
						}
					}
				}
			}
			$this->listeElemEvent();
			return $result;
		}
	}
?>
